function Lrk4_error
% Plots the error at t=tmax using the C-N & L-RK4 methods
% as a function of the number of time points used, and
% for the heat equation problem
% diff(u,x,x) = diff(u,t) for xL < x < xr, 0 < t < tmax
% where
% u = 0 at x=xL,xR and u = sin(2*pi*x) at t = 0
% clear all previous variables and plots
clear *
clf
% set parameters
tmax=0.1;
xL=0;
xR=1;
N=20;
% generate the points along the x-axis, x(1)=xL and x(N+2)=xR
x=linspace(xL,xR,N+2);
h=x(2)-x(1);
ii=0; ff=1; MM=2;
for i=1:21
if i==16
ff=5;
elseif i==21
ff=10;
elseif i==32
ff=100;
end;
MM=MM+ff;
ii=ii+1; points1(ii)=MM-1;
t=linspace(0,tmax,MM);
k=t(2)-t(1);
lamda=k/h^2;
errorC1(ii)=errorC(x,t,N+2,MM,tmax,lamda);
end;
ii=0; ff=1; MM=54;
for i=1:12
if i==5
ff=10;
elseif i==9
ff=20;
end;
MM=MM+ff;
ii=ii+1; points2(ii)=MM-1;
t=linspace(0,tmax,MM);
k=t(2)-t(1);
lamda=k/h^2;
errorRK1(ii)=errorRK(x,t,N+2,MM,tmax,lamda);
end;
N=40;
% generate the points along the x-axis, x(1)=xL and x(N+2)=xR
x=linspace(xL,xR,N+2);
h=x(2)-x(1);
ii=0; ff=2; MM=3;
for i=1:25
if i==10
ff=1;
elseif i==16
ff=3;
elseif i==20
ff=15;
elseif i==24
ff=50;
end;
MM=MM+ff;
ii=ii+1; points3(ii)=MM-1;
t=linspace(0,tmax,MM);
k=t(2)-t(1);
lamda=k/h^2;
errorC2(ii)=errorC(x,t,N+2,MM,tmax,lamda);
end;
ii=0; ff=1; MM=232;
% min MM=233
for i=1:11
if i==5
ff=100;
end;
MM=MM+ff;
ii=ii+1; points4(ii)=MM-1;
t=linspace(0,tmax,MM);
k=t(2)-t(1);
lamda=k/h^2;
errorRK2(ii)=errorRK(x,t,N+2,MM,tmax,lamda);
end;
% get(gcf)
%set(gcf,'Position', [1260 559 595 335]);
plotsize(595, 335)
% plot results
loglog(points1,errorC1,'--bo','MarkerSize',7)
hold on
loglog(points2,errorRK1,'-bd','MarkerSize',7)
loglog(points3,errorC2,'--rs','MarkerSize',7)
loglog(points4,errorRK2,'-r*','MarkerSize',7)
legend(' N = 20 (CN)',' N = 20 (RK4)',' N = 40 (CN)',' N = 40 (RK4)',3);
% axes used in plot
xlabel('Number of Time Points','FontSize',14,'FontWeight','bold')
ylabel('Error','FontSize',14,'FontWeight','bold')
% have MATLAB use certain plot options (all are optional)
grid on
set(gca,'MinorGridLineStyle','none')
set(gca,'FontSize',14)
set(findobj(gcf,'tag','legend'),'FontSize',14,'FontWeight','bold');
hold off
say=['Comparison of errors when u(x,0)=sin(2\pix)'];
title(say,'FontSize',14,'FontWeight','bold')
% error calculation for c-n
function q=errorC(x,t,N,M,tmax,lamda)
for i=1:N
exact(i)=exp(-4*pi*pi*tmax)*sin(2*pi*x(i));
end;
h=x(2)-x(1); k=t(2)-t(1);
ue=crank(x,t,N,M,h,k,lamda);
q=norm(ue(:,M)-exact',inf);
% error calculation for rk4 '
function q=errorRK(x,t,N,M,tmax,lamda)
for i=1:N
exact(i)=exp(-4*pi*pi*tmax)*sin(2*pi*x(i));
end;
h=x(2)-x(1); k=t(2)-t(1);
ue=rk4(x,t,N,M,h,k);
q=norm(ue(:,M)-exact',inf);
% c-n method '
function UC=crank(x,t,N,M,h,k,lamda)
UC=zeros(N,M);
for i=1:N
UC(i,1)=g(x(i));
end;
a=-2*(1+lamda)*ones(1,N); b=lamda*ones(1,N); c=b; z=zeros(1,N);
a(1)=1; c(1)=0; a(N)=1; b(N)=0;
for j=2:M
for i=2:N-1
z(i)=-lamda*UC(i+1,j-1)-2*(1-lamda)*UC(i,j-1)-lamda*UC(i-1,j-1)+k*f(x(i),t(j))+k*f(x(i+1),t(j-1));
end;
UC(:,j) = tridiag( a, b, c, z )';
end;
% rk4 method '
function UC=rk4(x,t,N,M,h,k)
UC=zeros(N,M);
for i=1:N
UC(i,1)=g(x(i));
end;
N2=N-2;
alpha=1/(h*h);
A=diag(-2*alpha*ones(N2,1))+diag(alpha*ones(N2-1,1),1)+diag(alpha*ones(N2-1,1),-1);
y=zeros(N2,1);
for i=1:N2
y(i)=g(x(i+1));
end;
for j=2:M
k1=k*A*y;
k2=k*A*(y+0.5*k1);
k3=k*A*(y+0.5*k2);
k4=k*A*(y+k3);
y=y+(k1+2*k2+2*k3+k4)/6;
UC(:,j) = [0; y; 0];
end;
% subfunction f(x,t)
function q=f(x,t)
q=0;
% subfunction g(x)
function q=g(x)
q=sin(2*pi*x);
% tridiagonal solver
function y = tridiag( a, b, c, f )
N = length(f);
v = zeros(1,N);
y = v;
w = a(1);
y(1) = f(1)/w;
for i=2:N
v(i-1) = c(i-1)/w;
w = a(i) - b(i)*v(i-1);
y(i) = ( f(i) - b(i)*y(i-1) )/w;
end;
for j=N-1:-1:1
y(j) = y(j) - v(j)*y(j+1);
end;
% subfunction plotsize
function plotsize(width,height)
siz=get(0,'ScreenSize');
bottom=max(siz(4)-height-95,1);
set(gcf,'Position', [2 bottom width height]);